import OpenAI from 'openai'
import { API_CONFIG } from '../config/api.js'
import { generateHTMLWithConversation } from './conversationManager.js'

// 创建OpenAI客户端实例
let openaiClient = new OpenAI({
  apiKey: API_CONFIG.API_TOKEN,
  baseURL: API_CONFIG.BASE_URL,
  dangerouslyAllowBrowser: true // 允许在浏览器中使用
})

/**
 * 获取模型列表
 * @returns {Promise<Array>} 模型列表
 */
export const getModelList = async () => {
  try {
    const response = await fetch('http://localhost:3001/v1/models', {
      method: 'GET',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${API_CONFIG.API_TOKEN}`
      }
    })
    
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`)
    }
    
    const data = await response.json()
    return data.data || []
  } catch (error) {
    console.error('获取模型列表失败:', error)
    return []
  }
}

/**
 * 生成HTML代码 - 流式请求
 * @param {Object} options 配置选项
 * @param {string} options.model 模型ID
 * @param {string} options.prompt 用户提示
 * @param {Function} options.onContent 处理内容数据的回调函数
 * @param {Function} options.onThinking 处理思考数据的回调函数
 * @param {Function} options.onComplete 完成时的回调函数
 * @param {Function} options.onError 错误处理回调函数
 */
export const generateHTMLStream = async ({ model, prompt, onContent, onThinking, onComplete, onError }) => {
  try {
    const response = await fetch('http://localhost:3001/v1/chat/completions', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${API_CONFIG.API_TOKEN}`
      },
      body: JSON.stringify({
        model: model,
        messages: [
          {
            role: 'system',
            content: '你是一个专业的前端开发专家，擅长创建美观、实用的HTML页面。请根据用户需求生成完整的HTML代码，包含内联CSS样式和必要的JavaScript功能。'
          },
          {
            role: 'user',
            content: `请生成一个HTML页面：${prompt}。要求：
1. 包含完整的HTML5结构（<!DOCTYPE html>、<html>、<head>、<body>等）
2. 使用内联CSS样式，确保页面美观
3. 如需要可包含JavaScript功能
4. 代码要规范、可读性强
5. 适配移动端和桌面端
6. 请直接返回HTML代码，不要包含markdown代码块标记`
          }
        ],
        temperature: API_CONFIG.DEFAULT_PARAMS.temperature,
        max_tokens: API_CONFIG.DEFAULT_PARAMS.max_tokens,
        stream: true
      })
    })

    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`)
    }

    const reader = response.body.getReader()
    const decoder = new TextDecoder()

    while (true) {
      const { done, value } = await reader.read()
      if (done) break

      const chunk = decoder.decode(value)
      const lines = chunk.split('\n')

      for (const line of lines) {
        if (line.startsWith('data: ')) {
          const data = line.slice(6)
          if (data === '[DONE]') {
            onComplete()
            return
          }

          try {
            const parsed = JSON.parse(data)
             const delta = parsed.choices?.[0]?.delta
             const message = parsed.choices?.[0]?.message
             
             // 处理推理内容（reasoning_content字段）
             if (delta?.reasoning_content) {
               onThinking(delta.reasoning_content)
             }
             
             // 处理普通内容
             if (delta?.content) {
               onContent(delta.content)
             }
             
             // 兼容处理thinking模型的推理内容
             if (message?.reasoning_content) {
               onThinking(message.reasoning_content)
             }
            
            // 处理完成状态
             if (parsed.choices?.[0]?.finish_reason) {
               onComplete()
               return
             }
           } catch (parseError) {
             console.warn('Failed to parse SSE data:', parseError)
           }
         }
       }
     }
     
     onComplete()
   } catch (error) {
     console.error('流式请求错误:', error)
     onError(error)
   }
 }

/**
 * 检查是否为thinking模型
 * @param {string} modelId 模型ID
 * @returns {boolean} 是否为thinking模型
 */
export const isThinkingModel = (modelId) => {
  return modelId && (modelId.includes('o1') || modelId.includes('reasoning'))
}

/**
 * 更新API配置
 * @param {Object} config 新的配置
 */
export const updateApiConfig = (config) => {
  if (config.baseUrl) {
    API_CONFIG.BASE_URL = config.baseUrl
  }
  
  if (config.apiToken) {
    API_CONFIG.API_TOKEN = config.apiToken
    API_CONFIG.HEADERS.Authorization = `Bearer ${config.apiToken}`
  }
  
  // 重新创建OpenAI客户端实例
  openaiClient = new OpenAI({
    apiKey: API_CONFIG.API_TOKEN,
    baseURL: API_CONFIG.BASE_URL,
    dangerouslyAllowBrowser: true
  })
}



export default {
  getModelList,
  generateHTMLStream,
  isThinkingModel,
  updateApiConfig
}